import 'dart:async';
import 'dart:io';

// import 'package:ffmpeg_kit_flutter/ffprobe_kit.dart';
// import 'package:ffmpeg_kit_flutter/media_information.dart';
// import 'package:ffmpeg_kit_flutter/media_information_session.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:path_provider/path_provider.dart' as syspaths;

class FileUtil {
  static Future<File> createTmpFile(String path, Uint8List bytes) async {
    final appDir = await syspaths.getTemporaryDirectory();
    var tmpPath = '${appDir.path}$path';
    File file = File(tmpPath);
    file.writeAsBytesSync(bytes);
    return file;
  }
  //获取图片信息
  static Future<ImageInfo> getImageInfo(String imageUrl) async {
    var completer = Completer<ImageInfo>();
    if (imageUrl.startsWith('http')) {
      // For web and mobile platforms
      var httpClient = HttpClient();
      try {
        var request = await httpClient.getUrl(Uri.parse(imageUrl));
        var response = await request.close();
        var bytes = await consolidateHttpClientResponseBytes(response);
        var image = Image.memory(bytes);
        image.image
            .resolve(const ImageConfiguration())
            .addListener(ImageStreamListener((imageInfo, _) {
          completer.complete(imageInfo);
        }));
      } catch (error) {
        completer.completeError(error);
      }
    } else {
      // For desktop platforms
      var file = File(imageUrl);
      var bytes = await file.readAsBytes();
      var image = Image.memory(bytes);
      image.image
          .resolve(const ImageConfiguration())
          .addListener(ImageStreamListener((imageInfo, _) {
        completer.complete(imageInfo);
      }));
    }
    return completer.future;
  }

  /// https://zhuanlan.zhihu.com/p/506499639
  ///视频流：
  // index：当前流的索引号，对应 AVStream->index。
  // codec_name：解码器名称，对应 AVCodecDescriptor *cd = avcodec_descriptor_get(AVStream->codecpar->codec_id); cd->name。
  // codec_long_name：解码器全名，对应 cd->long_name。
  // profile：编码等级，通过 avcodec_profile_name(AVStream->codecpar->codec_id, AVStream->codecpar->profile) 获得。
  // codec_type：流类型，即 av_get_media_type_string(AVStream->codecpar->codec_type)。
  // codec_time_base：编码的时间戳计算基础单位，对应 AVStream->codec->time_base。
  // codec_tag_string：编码器标签描述，对应 av_fourcc2str(AVStream->codecpar->codec_tag)。
  // codec_tag：对应 AVStream->codecpar->codec_tag。
  // width：有效区域的宽度，对应 AVStream->codecpar->width。
  // height：有效区域的高度，对应 AVStream->codecpar->height。
  // coded_width：视频帧宽度，可能与上面的宽度不同，因为有一些编码器要求帧的宽或高是某个数的倍数，所以如果输入的视频帧的宽或高不符合对应的规则时，则需要做填充，这里的 coded_width 就是填充后的宽度，在解码时需要用到这个参数来做对应的裁剪。对应 AVStream->codec->coded_width。
  // coded_height：视频帧高度，可能与上面的高度不同，对应 AVStream->codec->coded_height。
  // has_b_frames：是否包含 B 帧。
  // sample_aspect_ratio：简称 SAR，指的是图像采集时，横向采集点数与纵向采集点数的比例。FFmpeg提供了多个 SAR：AVStream->sample_aspect_ratio、AVStream->codecpar->sample_aspect_ratio、AVFrame->sample_aspect_ratio，通过 av_guess_sample_aspect_ratio 获取最终的 SAR。
  // display_aspect_ratio：简称 DAR，指的是真正展示的图像宽高比，在渲染视频时，必须根据这个比例进行缩放。通过 av_reduce 计算得到，PAR * SAR = DAR，其中 PAR 是 Pixel Aspect Ratio，表示单个像素的宽高比，大多数情况像素宽高比为 1:1，也就是一个正方形像素，如果不是 1:1，则该像素可以理解为长方形像素。
  // pix_fmt：像素格式，对应 av_get_pix_fmt_name(AVStream->codecpar->format)。
  // level：编码参数，对应AVStream->codecpar->level。
  // color_range：额外的色彩空间特征，对应 av_color_range_name(AVStream->codecpar->color_range)，AVCOL_RANGE_MPEG 对应 TV，AVCOL_RANGE_JPEG 对应 PC。
  // color_space：YUV 彩色空间类型，对应 av_color_space_name(AVStream->codecpar->color_space)。
  // color_transfer：颜色传输特性，对应 av_color_transfer_name(AVStream->codecpar->color_trc)。
  // color_primaries：对应 av_color_primaries_name(AVStream->codecpar->color_primaries)。
  // chroma_location：色度样品的位置，对应 av_chroma_location_name(AVStream->codecpar->chroma_location)。
  // field_order：交错视频中字段的顺序，对应 AVStream->codecpar->field_order。
  // timecode：通过 av_timecode_make_mpeg_tc_string 处理 AVStream->codec->timecode_frame_start 获得。
  // refs：参考帧数量，即 AVStream->codec->refs。
  // is_avc：是否 AVC。
  // nal_length_size：表示用几个字节表示 NALU 的长度。
  // id：
  // r_frame_rate：当前流的基本帧率，这个值仅是一个猜测，对应于 AVStream->r_frame_rate。
  // avg_frame_rate：平均帧率，对应于 AVStream->avg_frame_rate。
  // time_base：AVStream 的时间基准，即 AVStream->time_base。
  // start_pts：流开始的 PTS 时间戳，基于 time_base，即 AVStream->start_time。
  // start_time：转换 start_pts * time_base 之后的开始时间，单位秒。
  // duration_ts：流时长，基于 time_base，即 AVStream->duration。
  // duration：转换 duration_ts * time_base 之后的时长，单位秒。
  // bit_rate：码率，即 AVStream->codecpar->bit_rate。
  // max_bit_rate：最大码率，即 AVStream->codec->rc_max_rate。
  // bits_per_raw_sample：每个采样或像素的比特数，即 AVStream->codec->bits_per_raw_sample。
  // nb_frames：视频流中的帧数，即 AVStream->nb_frames。
  // nb_read_frames：略。
  // nb_read_packets：略。
  // TAG:*：对应 AVStream->metadata 中的信息。
  // TAG:rotate：逆时针的旋转角度（相当于正常视频的逆时针旋转角度）。
  // side_data：在视频流中，有时候我们还会看到 side_data 数据，对应 AVStream->side_data，示例如下：
  // [SIDE_DATA]
  // // side_data 数据类型，Display Matrix 表示一个 3*3 的矩阵，这个矩阵需要应用到解码后的视频帧上，才能正确展示：
  // side_data_type=Display Matrix
  // displaymatrix=
  // 00000000:   0 65536    0
  // 00000001: -65536  0    0
  // 00000002:   0  0 1073741824
  // // 顺时针旋转 90 度还原视频
  // rotation=-90
  // [/SIDE_DATA]
  // 音频流：
  //
  // sample_fmt：采样格式，通过 av_get_sample_fmt_name(AVStream->codecpar->format) 获取。
  // sample_rate：采样率，即 AVStream->codecpar->sample_rate。
  // channels：声道数，即 AVStream->codecpar->channels。
  // static Future<MediaInformationSession?> getVideoFileInfo(String path) async {
  //   var info = await FFprobeKit.getMediaInformation(path);
  //   return info;
  // }
}
